前幾天分享的,都是很簡單的替換關係,除非是特別指定哪幾個字符,否則替換範圍都是全局有效的,類似取代功能中的批次替換。
而在今天,我們要介紹上下文替代,是會依照該字符的上下文語境(context)去判斷是否需要替換。換句話說,此 feature 是存在邏輯判斷的。
舉例來說,像是 j
、q
、g
、y
這些擁有下降部(descender)的拉丁字母,如果同時出現在一起的話,下面可能就會擠在一起,可是和其他字符並排時又看起來好好的。
此時,我們就可以透過 calt 來指定當「特定字符一起出現時」,替換其中的某個字符。
以下面為例,當 g
和 j
接連出現時, j
的下面會太靠近 g
,完全沒有留白空間。但我們又不想改動原本 j 的造型,如果是調整 kerning 的話又會相鄰太遠。
這種情況下另外製作 g_y
的 liga 當然也是一種解法,但我們也可以透過 calt,當 g
出現在 j
前面時,將後面的 j
改成 j.ss01
,也就是另外一種文體的 j
。反之,如果沒有相鄰,就讓兩個字都保持原本的設計即可。
calt 通常預設也是關閉的,需要透過 css 啟用:
.class {
font-variant-ligatures: contextual;
-moz-font-feature-settings: "calt";
-webkit-font-feature-settings: "calt";
font-feature-settings: "calt";
}
上下文替代(與其類似的 feature 族)可以說是 OpenType 最有趣、最多變化的特性,沒有之一。只要能好好的設定,就能做出許多意想不到的功能。
例如之前 justfont 在愚人節推出的「就是不錯字(吧)」,就是透過判斷一組「詞」的字詞來替換。
以 ㄒㄩㄣˊㄨㄣˋ
二字來說,正確的寫法應該是 詢問
二字,但常常會有使用者打成 尋問
。此時,我們就可以透過 calt 特性,讓字型判斷當 尋
跟 問
出現在一起的時候,將前者的 尋
替換成 詢
;而若兩者沒有放在一起的話,就保持原狀就好。
不過呢!即使已經從上下文來決定要不要替代,但有時候還是要處理例外狀態,萬一有使用者想輸入 千尋問鍋爐爺爺能不能在這裡工作
這樣的字怎麼辦?如果什麼都不管的話,千尋
就變成 千詢
了,此時,就必須另外撰寫例外原則,我們在更之後的日子裡會更進一步的探討這個議題。
另一個例子是,有許多號稱簡體轉繁體的字型(許多裝置不允許線上翻譯,此時直接換字型是最快的),其實就是在簡體中文的碼位裡內放入繁體中文的字形,但由於簡體字和繁體字並不是一對一映射的關係,常常會出現 皇後
、辛醜年
這樣的機翻笑話,如果可以透過詞庫來組成 calt 規則,便能解決類似的誤會。
總之,在使用 calt 這種帶有邏輯、會考慮上下文字的 feature 時,最好對該語言和文字有一定程度的理解——在使用科技之餘,也不應該罔顧人文——否則就會出現笑話了。